home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / modules / nessus-2.2.8.mo / usr / lib / nessus / plugins / stun_detection.nasl < prev    next >
Text File  |  2005-03-31  |  6KB  |  187 lines

  1. #
  2. # This script was written by Noam Rathaus
  3. #
  4. # See the Nessus Scripts License for details
  5. #
  6.  
  7. if(description)
  8. {
  9.  script_id(11986);
  10.  script_version("$Revision: 1.3 $");
  11.  name["english"] = "Detect STUN Server";
  12.  script_name(english:name["english"]);
  13.  
  14.  desc["english"] = "
  15. We have detected that the remote host is running a STUN (Simple 
  16. Traversal of User Datagram Protocol - RFC 3489) server.
  17.  
  18. Simple Traversal of User Datagram Protocol (UDP) Through Network
  19. Address Translators (NATs) (STUN) is a lightweight protocol that
  20. allows applications to discover the presence and types of NATs and
  21. firewalls between them and the public Internet.  It also provides the
  22. ability for applications to determine the public Internet Protocol
  23. (IP) addresses allocated to them by the NAT.  STUN works with many
  24. existing NATs, and does not require any special behavior from them.
  25. As a result, it allows a wide variety of applications to work through
  26. existing NAT infrastructure.
  27.  
  28. Risk factor : Low";
  29.  
  30.  script_description(english:desc["english"]);
  31.  
  32.  summary["english"] = "STUN Server Detection";
  33.  script_summary(english:summary["english"]);
  34.  
  35.  script_category(ACT_GATHER_INFO);
  36.  
  37.  script_copyright(english:"This script is Copyright (C) 2004 Noam Rathaus");
  38.  script_family(english:"Service detection");
  39.  exit(0);
  40. }
  41.  
  42. include("global_settings.inc");
  43. include("misc_func.inc");
  44. include ("dump.inc");
  45. debug = debug_level;
  46.  
  47. #port = get_kb_item("Services/stun");
  48. port = 3478;
  49. # This is UDP based protocol ...
  50.  
  51. udpsock = open_sock_udp(port);
  52. data = raw_string(0x00, 0x01, # Binding request
  53.                   0x00, 0x08, # Message length
  54.                   0x12, 0x23, 0x34, 0x45, 0x56, 0x67, 0x78, 0x89, 0x90, 0x01, 0x12, 0x23, 0x34, 0x45, 0x56, 0x67, # Message ID
  55.                   0x00, 0x03, # Change-Request
  56.                   0x00, 0x04, # Attribute length
  57.                   0x00, 0x00, 0x00, 0x00 # Not Set, Not Set
  58.                  );
  59.  
  60. send(socket:udpsock, data:data);
  61.  
  62. response = "";
  63.  
  64. z = recv(socket:udpsock, length:1024, min:1);
  65. if(z)
  66. {
  67.  if (debug)
  68.  {
  69.   dump(dtitle:"STUN", ddata:z);
  70.  }
  71.  
  72.  if (z[0] == raw_string(0x01) && z[1] == raw_string(0x01)) # Binding Response
  73.  {
  74.   length = ord(z[2])*256 + ord(z[3]);
  75.  
  76.   if (debug)
  77.   {
  78.    display("length: ", length, "\n");
  79.   }
  80.  
  81.   offset = 2+2+16;
  82.   for (i = 0; i < length;)
  83.   {
  84.    count = 0;
  85.    if (z[i+offset] == raw_string(0x00) && z[i+1+offset] == raw_string(0x01)) # Mapped address
  86.    {
  87.     count += 2;
  88.     if (z[i+count+offset] == raw_string(0x00) && z[i+count+1+offset] == raw_string(0x08)) # Attribute length should be 8
  89.     {
  90.      count += 2;
  91.      if (z[i+count+1+offset] == raw_string(0x01)) # IPv4
  92.      {
  93.       count += 2;
  94.       port = ord(z[i+count+offset])*256+ord(z[i+count+1+offset]);
  95.       ip = string(ord(z[i+count+2+offset]), ".", ord(z[i+count+3+offset]), ".", ord(z[i+count+4+offset]), ".", ord(z[i+count+5+offset]));
  96.       count += 6;
  97.  
  98.       response = string(response, "Mapped Address: ", ip, ":", port, "\n");
  99. #      display("Mapped address\n");
  100. #      display("port: ", port, "\n");
  101. #      display("ip: ", ip, "\n");
  102.      }
  103.     }
  104.    }
  105.  
  106.    if (z[i+offset] == raw_string(0x00) && z[i+1+offset] == raw_string(0x04)) # Source Address
  107.    {
  108.     count += 2;
  109.     if (z[i+count+offset] == raw_string(0x00) && z[i+count+1+offset] == raw_string(0x08)) # Attribute length should be 8
  110.     {
  111.      count += 2;
  112.      if (z[i+count+1+offset] == raw_string(0x01)) # IPv4
  113.      {
  114.       count += 2;
  115.       port = ord(z[i+count+offset])*256+ord(z[i+count+1+offset]);
  116.       ip = string(ord(z[i+count+2+offset]), ".", ord(z[i+count+3+offset]), ".", ord(z[i+count+4+offset]), ".", ord(z[i+count+5+offset]));
  117.       count += 6;
  118.  
  119.       response = string(response, "Source Address: ", ip, ":", port, "\n");
  120. #      display("Soure Address\n");
  121. #      display("port: ", port, "\n");
  122. #      display("ip: ", ip, "\n");
  123.      }
  124.     }
  125.    }
  126.  
  127.    if (z[i+offset] == raw_string(0x00) && z[i+1+offset] == raw_string(0x05)) # Changed Address
  128.    {
  129.     count += 2;
  130.     if (z[i+count+offset] == raw_string(0x00) && z[i+count+1+offset] == raw_string(0x08)) # Attribute length should be 8
  131.     {
  132.      count += 2;
  133.      if (z[i+count+1+offset] == raw_string(0x01)) # IPv4
  134.      {
  135.       count += 2;
  136.       port = ord(z[i+count+offset])*256+ord(z[i+count+1+offset]);
  137.       ip = string(ord(z[i+count+2+offset]), ".", ord(z[i+count+3+offset]), ".", ord(z[i+count+4+offset]), ".", ord(z[i+count+5+offset]));
  138.       count += 6;
  139.  
  140.       response = string(response, "Changed Address: ", ip, ":", port, "\n");
  141. #      display("Changed Address\n");
  142. #      display("port: ", port, "\n");
  143. #      display("ip: ", ip, "\n");
  144.      }
  145.     }
  146.    }
  147.  
  148.    if (count == 0)
  149.    {
  150.     if (debug)
  151.     {
  152.      display("z[i(", i, ")+offset(", offset, ")]: ", ord(z[i+offset]), "\n");
  153.     }
  154.     i++;
  155.    }
  156.  
  157.    i += count;
  158.   }
  159.  
  160.   if (response)
  161.   {
  162.    report = "
  163. The remote host is running a STUN (Simple Traversal of User Datagram 
  164. Protocol - RFC 3489) server.
  165.  
  166. Simple Traversal of User Datagram Protocol (UDP) Through Network
  167. Address Translators (NATs) (STUN) is a lightweight protocol that
  168. allows applications to discover the presence and types of NATs and
  169. firewalls between them and the public Internet.  It also provides the
  170. ability for applications to determine the public Internet Protocol
  171. (IP) addresses allocated to them by the NAT.  STUN works with many
  172. existing NATs, and does not require any special behavior from them.
  173. As a result, it allows a wide variety of applications to work through
  174. existing NAT infrastructure.
  175.  
  176.  
  177. " + response + "
  178.  
  179. Solution : Filter incoming traffic to this port
  180. Risk factor : Low";
  181.    security_note(port:port, proto:"udp", data:response);
  182.    register_service(port: port, proto: "stun", ipproto: "udp");
  183.    exit(0);
  184.   }
  185.  }
  186. }
  187.